//是假复杂度O(nm)，一般用来存储存在负权边（甚至可以有负权环）的单源汇问题
#include <iostream>
#include <cstring>
using namespace std;

typedef struct Edge //存储边的属性
{
    int a; //边的起点
    int b; //边的终点
    int w; //边的权值，可以为负
} edge;

const int N = 10010;        //边的上限
const int M = 510;          //点的上限
const int INF = 0x3f3f3f3f; //设置的无限大，可以认为是不可达
edge edges[N];              //记录每一条边
int dist[M];                //记录最短路
int last[M];                //记录上次的最短路，防止用新的更新新的
int n, m, k;                //分别点数，边数，最长的步数
int a, b, w;                //存储输入的边的信息

int bellman(int x = 1, int y = n)
{
    memset(dist, 0x3f, sizeof dist); //先把所有点到起点的距离初始化为无穷大
    dist[x] = 0;
    for (int i = 1; i <= k; ++i) //循环k次，第i次表示此次更新的点，从起点最多走k步就能到达
    {
        memcpy(last, dist, sizeof dist); //备份此次的旧的dist，以防止用新的更新新的，出现第i此更新，却有起点走大于k步才能到达的点
        for (int j = 0; j < m; ++j)      //遍历所有的边，进行松弛更新操作
            dist[edges[j].b] = min(dist[edges[j].b], last[edges[j].a] + edges[j].w);
    }
    return dist[y];
}

int main()
{
    cin >> n >> m >> k;
    for (int i = 0; i < m; ++i)
    {
        cin >> a >> b >> w;
        edges[i].a = a;
        edges[i].b = b;
        edges[i].w = w;
    }
    int t = bellman();
    if (t > INF / 2) //小于INF/2是因为如果有不可达的点与负权边相邻，被负权边更新了，但是依旧不可达
        cout << "impossible";
    else
        cout << t;
    return 0;
}